% coding: utf-8


\subsection{Clase principal del proyecto Java:}

\begin{Verbatim}[frame=single, label=C\'odigo, numbers=left]

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.RuleReturnScope;

public class CalculadoraParaFisicos {

	public static void main(String[] args) throws RecognitionException {

    	String entrada = "", defaultInFileName = "d:\\entrada.txt";
    	Scanner scanner = new Scanner( System.in );
		System.out.print( "Inserte una opción: \n" );
		System.out.print( "1: entrada por consola \n" );
		System.out.print( "2: entrada por archivo \n" );
		System.out.print( "3: entrada 'unidades m;' \n" );
		System.out.print( "4: entrada '1/2;' \n" );
		System.out.print( "5: entrada por archivo en path " + defaultInFileName + "\n");
		
		String opcion = scanner.nextLine();

		while (opcion.compareTo("exit") != 0){
			Integer opcion_int = Integer.parseInt(opcion);
			
			switch(opcion_int){
			case 1:
				entrada = obtenerEntradaPorConsola();
				break;
			case 2:
				entrada = obtenerEntradaPorArchivo("");
				break;
			case 3:
				entrada = "unidades m;";
				break;
			case 4:
				entrada = "1/2;";
				break;
			case 5:
				entrada = obtenerEntradaPorArchivo(defaultInFileName);
				break;
			default:
				entrada = "1 / 2 ;";
				break;
			}
	    			
	
			CharStream cs = new ANTLRStringStream(entrada);
			gramaticaLexer lexer = new gramaticaLexer(cs);
			CommonTokenStream tokens = new CommonTokenStream();
			tokens.setTokenSource(lexer);		
			gramaticaParser parser = new gramaticaParser(tokens);
			parser.programa();

			System.out.print( "Inserte una opción: \n" );
			System.out.print( "1: entrada por consola \n" );
			System.out.print( "2: entrada por archivo \n" );
			System.out.print( "3: entrada 'unidades m;' \n" );
			System.out.print( "4: entrada '1/2;' \n" );
			System.out.print( "5: entrada por archivo en path " + defaultInFileName + "\n");

			opcion = scanner.nextLine();

		}
		
	}

	/*------------------------------------------------------------------------*/
	
	
	static String obtenerEntradaPorArchivo(String aFileName){
		String theFileNameToRead;
		if(aFileName == "")
		{
			Scanner scanner = new Scanner( System.in );
			System.out.print( "Inserte el path del archivo: " );   
			theFileNameToRead = scanner.nextLine();
		}
		else
			theFileNameToRead = aFileName;
		
		File file = new File( theFileNameToRead );            
	    String entrada = "";
	    if ( file.exists() )                         
	    {                                            
	        try{
	        	Scanner inFile = new Scanner( file );
		        int lineNum = 0;
		        while ( inFile.hasNext() )
		        {
		            String line = inFile.nextLine();  
		            System.out.println( ++lineNum + ": " + line );
		            if (line != "<EOF>"){
			            entrada = entrada + line + " ";
		            }
		        }
		        inFile.close();
	        }
	        catch (FileNotFoundException e){
	        }
	    }
	    
	    return entrada;
	}
		
	
	/*------------------------------------------------------------------------*/
	
	static String obtenerEntradaPorConsola(){
		Scanner scanner = new Scanner( System.in );
		System.out.print( "Inserte una cadena: " );
	    String entrada = scanner.nextLine();
	    return entrada;
	}
	
}


\end{Verbatim}

